"use strict";

function t(t) {
  for (var i = Object.create(null), s = t.split(","), e = s.length; e--;) i[s[e]] = !0;

  return i;
}

function i(t, i) {
  for (var s = t.indexOf("&"); -1 != s;) {
    var e = t.indexOf(";", s + 3),
        n = void 0;
    if (-1 == e) break;
    "#" == t[s + 1] ? (n = parseInt(("x" == t[s + 2] ? "0" : "") + t.substring(s + 2, e)), isNaN(n) || (t = t.substr(0, s) + String.fromCharCode(n) + t.substr(e + 1))) : (n = t.substring(s + 1, e), (a.entities[n] || "amp" == n && i) && (t = t.substr(0, s) + (a.entities[n] || "&") + t.substr(e + 1))), s = t.indexOf("&", s + 1);
  }

  return t;
}

function s(t) {
  this.options = t.data || {}, this.tagStyle = Object.assign(a.tagStyle, this.options.tagStyle), this.imgList = t.imgList || [], this.plugins = t.plugins || [], this.attrs = Object.create(null), this.stack = [], this.nodes = [];
}

function e(t) {
  this.handler = t;
}

var a = {
  trustTags: t("a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video"),
  blockTags: t("address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section"),
  ignoreTags: t("area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr"),
  voidTags: t("area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr"),
  entities: {
    lt: "<",
    gt: ">",
    quot: '"',
    apos: "'",
    ensp: " ",
    emsp: " ",
    nbsp: " ",
    semi: ";",
    ndash: "–",
    mdash: "—",
    middot: "·",
    lsquo: "‘",
    rsquo: "’",
    ldquo: "“",
    rdquo: "”",
    bull: "•",
    hellip: "…"
  },
  tagStyle: {
    address: "font-style:italic",
    big: "display:inline;font-size:1.2em",
    caption: "display:table-caption;text-align:center",
    center: "text-align:center",
    cite: "font-style:italic",
    dd: "margin-left:40px",
    mark: "background-color:yellow",
    pre: "font-family:monospace;white-space:pre",
    s: "text-decoration:line-through",
    small: "display:inline;font-size:0.8em",
    u: "text-decoration:underline"
  }
},
    n = uni.getSystemInfoSync().windowWidth,
    r = t(" ,\r,\n,\t,\f"),
    h = 0;
s.prototype.parse = function (t) {
  for (var i = this.plugins.length; i--;) this.plugins[i].onUpdate && (t = this.plugins[i].onUpdate(t, a) || t);

  for (new e(this).parse(t); this.stack.length;) this.popNode();

  return this.nodes;
}, s.prototype.expose = function () {
  for (var t = this.stack.length; t--;) {
    var i = this.stack[t];
    if ("a" == i.name || i.c) return;
    i.c = 1;
  }
}, s.prototype.hook = function (t) {
  for (var i = this.plugins.length; i--;) if (this.plugins[i].onParse && 0 == this.plugins[i].onParse(t, this)) return !1;

  return !0;
}, s.prototype.getUrl = function (t) {
  var i = this.options.domain;
  return "/" == t[0] ? "/" == t[1] ? t = (i ? i.split("://")[0] : "http") + ":" + t : i && (t = i + t) : !i || t.includes("data:") || t.includes("://") || (t = i + "/" + t), t;
}, s.prototype.parseStyle = function (t) {
  var i = t.attrs,
      s = (this.tagStyle[t.name] || "").split(";").concat((i.style || "").split(";")),
      e = {},
      a = "";
  i.id && (this.options.useAnchor ? this.expose() : "img" != t.name && "a" != t.name && "video" != t.name && "audio" != t.name && (i.id = void 0)), i.width && (e.width = parseFloat(i.width) + (i.width.includes("%") ? "%" : "px"), i.width = void 0), i.height && (e.height = parseFloat(i.height) + (i.height.includes("%") ? "%" : "px"), i.height = void 0);

  for (var h = 0, o = s.length; h < o; h++) {
    var l = s[h].split(":");

    if (!(l.length < 2)) {
      var c = l.shift().trim().toLowerCase(),
          d = l.join(":").trim();
      if ("-" == d[0] && d.lastIndexOf("-") > 0 || d.includes("safe")) a += ";".concat(c, ":").concat(d);else if (!e[c] || d.includes("import") || !e[c].includes("import")) {
        if (d.includes("url")) {
          var p = d.indexOf("(") + 1;

          if (p) {
            for (; '"' == d[p] || "'" == d[p] || r[d[p]];) p++;

            d = d.substr(0, p) + this.getUrl(d.substr(p));
          }
        } else d.includes("rpx") && (d = d.replace(/[0-9.]+\s*rpx/g, function (t) {
          return parseFloat(t) * n / 750 + "px";
        }));

        e[c] = d;
      }
    }
  }

  return t.attrs.style = a, e;
}, s.prototype.onTagName = function (t) {
  this.tagName = this.xml ? t : t.toLowerCase(), "svg" == this.tagName && (this.xml = !0);
}, s.prototype.onAttrName = function (t) {
  t = this.xml ? t : t.toLowerCase(), "data-" == t.substr(0, 5) ? "data-src" != t || this.attrs.src ? "img" == this.tagName || "a" == this.tagName ? this.attrName = t : this.attrName = void 0 : this.attrName = "src" : (this.attrName = t, this.attrs[t] = "T");
}, s.prototype.onAttrVal = function (t) {
  var s = this.attrName || "";
  "style" == s || "href" == s ? this.attrs[s] = i(t, !0) : s.includes("src") ? this.attrs[s] = this.getUrl(i(t, !0)) : s && (this.attrs[s] = t);
}, s.prototype.onOpenTag = function (t) {
  var i = Object.create(null);
  i.name = this.tagName, i.attrs = this.attrs, this.attrs = Object.create(null);
  var s = i.attrs,
      e = this.stack[this.stack.length - 1],
      r = e ? e.children : this.nodes,
      o = this.xml ? t : a.voidTags[i.name];

  if ("embed" == i.name) {
    var l = s.src || "";
    l.includes(".mp4") || l.includes(".3gp") || l.includes(".m3u8") || (s.type || "").includes("video") ? i.name = "video" : (l.includes(".mp3") || l.includes(".wav") || l.includes(".aac") || l.includes(".m4a") || (s.type || "").includes("audio")) && (i.name = "audio"), s.autostart && (s.autoplay = "T"), s.controls = "T";
  }

  if ("video" != i.name && "audio" != i.name || ("video" != i.name || s.id || (s.id = "v" + h++), s.controls || s.autoplay || (s.controls = "T"), i.src = [], s.src && (i.src.push(s.src), s.src = void 0), this.expose()), o) {
    if (!this.hook(i) || a.ignoreTags[i.name]) return void ("base" != i.name || this.options.domain ? "source" == i.name && e && ("video" == e.name || "audio" == e.name) && s.src && e.src.push(s.src) : this.options.domain = s.href);
    var c = this.parseStyle(i);

    if ("img" == i.name) {
      if (s.src && (s.src.includes("webp") && (i.webp = "T"), s.src.includes("data:") && !s["original-src"] && (s.ignore = "T"), !s.ignore || i.webp || s.src.includes("cloud://"))) {
        for (var d = this.stack.length; d--;) {
          var p = this.stack[d];

          if ("a" == p.name) {
            i.a = p.attrs;
            break;
          }

          var u = p.attrs.style || "";
          if (!u.includes("flex:") || u.includes("flex:0") || u.includes("flex: 0") || c.width && c.width.includes("%")) {
            if (u.includes("flex") && "100%" == c.width) for (var g = d + 1; g < this.stack.length; g++) {
              var f = this.stack[g].attrs.style || "";

              if (!f.includes(";width") && !f.includes(" width") && 0 != f.indexOf("width")) {
                c.width = "";
                break;
              }
            } else u.includes("inline-block") && (c.width && "%" == c.width[c.width.length - 1] ? (p.attrs.style += ";max-width:" + c.width, c.width = "") : p.attrs.style += ";max-width:100%");
          } else {
            c.width = "100% !important", c.height = "";

            for (var m = d + 1; m < this.stack.length; m++) this.stack[m].attrs.style = (this.stack[m].attrs.style || "").replace("inline-", "");
          }
          p.c = 1;
        }

        i.i = this.imgList.length;
        var v = s["original-src"] || s.src;

        if (this.imgList.includes(v)) {
          var y = v.indexOf("://");

          if (-1 != y) {
            y += 3;

            for (var x = v.substr(0, y); y < v.length && "/" != v[y]; y++) x += Math.random() > .5 ? v[y].toUpperCase() : v[y];

            x += v.substr(y), v = x;
          }
        }

        this.imgList.push(v);
      }

      "inline" == c.display && (c.display = ""), s.ignore && (c["max-width"] = c["max-width"] || "100%", s.style += ";-webkit-touch-callout:none"), parseInt(c.width) > n && (c.height = void 0), c.width && (c.width.includes("auto") ? c.width = "" : (i.w = "T", c.height && !c.height.includes("auto") && (i.h = "T")));
    } else if ("svg" == i.name) return r.push(i), this.stack.push(i), void this.popNode();

    for (var b in c) c[b] && (s.style += ";".concat(b, ":").concat(c[b].replace(" !important", "")));

    s.style = s.style.substr(1) || void 0;
  } else ("pre" == i.name || (s.style || "").includes("white-space") && s.style.includes("pre")) && (this.pre = i.pre = !0), i.children = [], this.stack.push(i);

  r.push(i);
}, s.prototype.onCloseTag = function (t) {
  t = this.xml ? t : t.toLowerCase();
  var i;

  for (i = this.stack.length; i-- && this.stack[i].name != t;);

  if (-1 != i) for (; this.stack.length > i;) this.popNode();else if ("p" == t || "br" == t) {
    var s = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes;
    s.push({
      name: t,
      attrs: {}
    });
  }
}, s.prototype.popNode = function () {
  var t = this.stack.pop(),
      i = t.attrs,
      s = t.children,
      e = this.stack[this.stack.length - 1],
      r = e ? e.children : this.nodes;
  if (!this.hook(t) || a.ignoreTags[t.name]) return "title" == t.name && s.length && "text" == s[0].type && this.options.setTitle && uni.setNavigationBarTitle({
    title: s[0].text
  }), void r.pop();

  if (t.pre) {
    t.pre = this.pre = void 0;

    for (var h = this.stack.length; h--;) this.stack[h].pre && (this.pre = !0);
  }

  if ("svg" == t.name) {
    var o = "",
        l = i.style;
    return i.style = "", i.viewbox && (i.viewBox = i.viewbox), i.xmlns = "http://www.w3.org/2000/svg", function t(i) {
      o += "<" + i.name;

      for (var s in i.attrs) {
        var e = i.attrs[s];
        e && (o += " ".concat(s, '="').concat(e, '"'));
      }

      if (i.children) {
        o += ">";

        for (var a = 0; a < i.children.length; a++) t(i.children[a]);

        o += "</" + i.name + ">";
      } else o += "/>";
    }(t), t.name = "img", t.attrs = {
      src: "data:image/svg+xml;utf8," + o.replace(/#/g, "%23"),
      style: l,
      ignore: "T"
    }, t.children = void 0, void (this.xml = !1);
  }

  var c = {};

  if (i.align && ("table" == t.name ? "center" == i.align ? c["margin-inline-start"] = c["margin-inline-end"] = "auto" : c.float = i.align : c["text-align"] = i.align, i.align = void 0), "font" == t.name && (i.color && (c.color = i.color, i.color = void 0), i.face && (c["font-family"] = i.face, i.face = void 0), i.size)) {
    var d = parseInt(i.size);
    isNaN(d) || (d < 1 ? d = 1 : d > 7 && (d = 7), c["font-size"] = ["xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large"][d - 1]), i.size = void 0;
  }

  if ((i.class || "").includes("align-center") && (c["text-align"] = "center"), Object.assign(c, this.parseStyle(t)), parseInt(c.width) > n && (c["max-width"] = "100%", c["box-sizing"] = "border-box"), a.blockTags[t.name]) t.name = "div";else if (a.trustTags[t.name] || this.xml) {
    if ("a" == t.name || "ad" == t.name) this.expose();else if ("video" == t.name || "audio" == t.name) t.children = void 0;else if ("ul" != t.name && "ol" != t.name || !t.c) {
      if ("table" == t.name) {
        var p = parseFloat(i.cellpadding),
            u = parseFloat(i.cellspacing),
            g = parseFloat(i.border);

        if (t.c && (isNaN(p) && (p = 2), isNaN(u) && (u = 2)), g && (i.style += ";border:" + g + "px solid gray"), t.flag && t.c) {
          t.flag = void 0, c.display = "grid", u ? (c["grid-gap"] = u + "px", c.padding = u + "px") : g && (i.style += ";border-left:0;border-top:0");
          var f = [],
              m = [],
              v = [],
              y = {};
          !function t(i) {
            for (var s = 0; s < i.length; s++) "tr" == i[s].name ? m.push(i[s]) : t(i[s].children || []);
          }(s);

          for (var x = 1; x <= m.length; x++) {
            for (var b = 1, w = 0; w < m[x - 1].children.length; w++, b++) {
              var k = m[x - 1].children[w];

              if ("td" == k.name || "th" == k.name) {
                for (; y[x + "." + b];) b++;

                k.c = 1;
                var N = k.attrs.style || "",
                    T = N.indexOf("width") ? N.indexOf(";width") : 0;

                if (-1 != T) {
                  var O = N.indexOf(";", T + 6);
                  -1 == O && (O = N.length), k.attrs.colspan || (f[b] = N.substring(T ? T + 7 : 6, O)), N = N.substr(0, T) + N.substr(O);
                }

                if (N += (g ? ";border:".concat(g, "px solid gray") + (u ? "" : ";border-right:0;border-bottom:0") : "") + (p ? ";padding:".concat(p, "px") : ""), k.attrs.colspan && (N += ";grid-column-start:".concat(b, ";grid-column-end:").concat(b + parseInt(k.attrs.colspan)), k.attrs.rowspan || (N += ";grid-row-start:".concat(x, ";grid-row-end:").concat(x + 1)), b += parseInt(k.attrs.colspan) - 1), k.attrs.rowspan) {
                  N += ";grid-row-start:".concat(x, ";grid-row-end:").concat(x + parseInt(k.attrs.rowspan)), k.attrs.colspan || (N += ";grid-column-start:".concat(b, ";grid-column-end:").concat(b + 1));

                  for (var C = 1; C < k.attrs.rowspan; C++) y[x + C + "." + b] = 1;
                }

                N && (k.attrs.style = N), v.push(k);
              }
            }

            if (1 == x) {
              for (var A = "", S = 1; S < b; S++) A += (f[S] ? f[S] : "auto") + " ";

              c["grid-template-columns"] = A;
            }
          }

          t.children = v;
        } else t.c && (c.display = "table"), isNaN(u) || (c["border-spacing"] = u + "px"), (g || p || t.c) && function i(s) {
          for (var e = 0; e < s.length; e++) {
            var a = s[e];
            t.c && (a.c = 1), "th" == a.name || "td" == a.name ? (g && (a.attrs.style = "border:".concat(g, "px solid gray;").concat(a.attrs.style || "")), p && (a.attrs.style = "padding:".concat(p, "px;").concat(a.attrs.style || ""))) : a.children && i(a.children);
          }
        }(s);

        if (this.options.scrollTable && !(i.style || "").includes("inline")) {
          var z = Object.assign({}, t);
          t.name = "div", t.attrs = {
            style: "overflow-x:auto;padding:1px"
          }, t.children = [z], i = z.attrs;
        }
      } else if ("td" != t.name && "th" != t.name || !i.colspan && !i.rowspan) {
        if ("ruby" == t.name) {
          t.name = "span";

          for (var I = 0; I < s.length - 1; I++) "text" == s[I].type && "rt" == s[I + 1].name && (s[I] = {
            name: "span",
            attrs: {
              style: "display:inline-block"
            },
            children: [{
              name: "div",
              attrs: {
                style: "font-size:50%;text-align:start"
              },
              children: s[I + 1].children
            }, s[I]]
          }, s.splice(I + 1, 1));
        }
      } else for (var j = this.stack.length; j--;) if ("table" == this.stack[j].name) {
        this.stack[j].flag = 1;
        break;
      }
    } else {
      var L = {
        a: "lower-alpha",
        A: "upper-alpha",
        i: "lower-roman",
        I: "upper-roman"
      };
      L[i.type] && (i.style += ";list-style-type:" + L[i.type], i.type = void 0), t.c = 1;

      for (var q = s.length; q--;) "li" == s[q].name && (s[q].c = 1);
    }
  } else t.name = "span";
  if ((c.display || "").includes("flex") && !t.c) for (var F = s.length; F--;) {
    var U = s[F];
    U.f && (U.attrs.style = (U.attrs.style || "") + U.f, U.f = void 0);
  }
  var V = e && (e.attrs.style || "").includes("flex") && !t.c && !(c.display || "").includes("inline");
  V && (t.f = ";max-width:100%");

  for (var B in c) if (c[B]) {
    var P = ";".concat(B, ":").concat(c[B].replace(" !important", ""));
    V && (B.includes("flex") && "flex-direction" != B || "align-self" == B || "-" == c[B][0] || "width" == B && P.includes("%")) ? (t.f += P, "width" == B && (i.style += ";width:100%")) : i.style += P;
  }

  i.style = i.style.substr(1) || void 0;
}, s.prototype.onText = function (t) {
  if (!this.pre) {
    for (var s, e = "", a = 0, n = t.length; a < n; a++) r[t[a]] ? (" " != e[e.length - 1] && (e += " "), "\n" != t[a] || s || (s = !0)) : e += t[a];

    if (" " == e && s) return;
    t = e;
  }

  var h = Object.create(null);

  if (h.type = "text", h.text = i(t), this.hook(h)) {
    (this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes).push(h);
  }
}, e.prototype.parse = function (t) {
  this.content = t || "", this.i = 0, this.start = 0, this.state = this.text;

  for (var i = this.content.length; -1 != this.i && this.i < i;) this.state();
}, e.prototype.checkClose = function (t) {
  var i = "/" == this.content[this.i];
  return !!(">" == this.content[this.i] || i && ">" == this.content[this.i + 1]) && (t && this.handler[t](this.content.substring(this.start, this.i)), this.i += i ? 2 : 1, this.start = this.i, this.handler.onOpenTag(i), "script" == this.handler.tagName ? (this.i = this.content.indexOf("</", this.i), -1 != this.i && (this.i += 2, this.start = this.i), this.state = this.endTag) : this.state = this.text, !0);
}, e.prototype.text = function () {
  if (this.i = this.content.indexOf("<", this.i), -1 == this.i) return void (this.start < this.content.length && this.handler.onText(this.content.substring(this.start, this.content.length)));
  var t = this.content[this.i + 1];
  if (t >= "a" && t <= "z" || t >= "A" && t <= "Z") this.start != this.i && this.handler.onText(this.content.substring(this.start, this.i)), this.start = ++this.i, this.state = this.tagName;else if ("/" == t || "!" == t || "?" == t) {
    this.start != this.i && this.handler.onText(this.content.substring(this.start, this.i));
    var i = this.content[this.i + 2];
    if ("/" == t && (i >= "a" && i <= "z" || i >= "A" && i <= "Z")) return this.i += 2, this.start = this.i, this.state = this.endTag;
    var s = "--\x3e";
    "!" == t && "-" == this.content[this.i + 2] && "-" == this.content[this.i + 3] || (s = ">"), this.i = this.content.indexOf(s, this.i), -1 != this.i && (this.i += s.length, this.start = this.i);
  } else this.i++;
}, e.prototype.tagName = function () {
  if (r[this.content[this.i]]) {
    for (this.handler.onTagName(this.content.substring(this.start, this.i)); r[this.content[++this.i]];);

    this.i < this.content.length && !this.checkClose() && (this.start = this.i, this.state = this.attrName);
  } else this.checkClose("onTagName") || this.i++;
}, e.prototype.attrName = function () {
  var t = this.content[this.i];

  if (r[t] || "=" == t) {
    this.handler.onAttrName(this.content.substring(this.start, this.i));

    for (var i = "=" == t, s = this.content.length; ++this.i < s;) if (t = this.content[this.i], !r[t]) {
      if (this.checkClose()) return;
      if (i) return this.start = this.i, this.state = this.attrVal;
      if ("=" != this.content[this.i]) return this.start = this.i, this.state = this.attrName;
      i = !0;
    }
  } else this.checkClose("onAttrName") || this.i++;
}, e.prototype.attrVal = function () {
  var t = this.content[this.i],
      i = this.content.length;

  if ('"' == t || "'" == t) {
    if (this.start = ++this.i, this.i = this.content.indexOf(t, this.i), -1 == this.i) return;
    this.handler.onAttrVal(this.content.substring(this.start, this.i));
  } else for (; this.i < i; this.i++) {
    if (r[this.content[this.i]]) {
      this.handler.onAttrVal(this.content.substring(this.start, this.i));
      break;
    }

    if (this.checkClose("onAttrVal")) return;
  }

  for (; r[this.content[++this.i]];);

  this.i < i && !this.checkClose() && (this.start = this.i, this.state = this.attrName);
}, e.prototype.endTag = function () {
  var t = this.content[this.i];

  if (r[t] || ">" == t || "/" == t) {
    if (this.handler.onCloseTag(this.content.substring(this.start, this.i)), ">" != t && (this.i = this.content.indexOf(">", this.i), -1 == this.i)) return;
    this.start = ++this.i, this.state = this.text;
  } else this.i++;
}, module.exports = s;